/**
 * 判断括号匹配
 * 
 * () => true
 * ()[]{} => true
 * ([)] =》 false
 * {[]} => true
 * 
 * 思路：
 *     遇到左括号则入栈，遇到右括号则弹出栈顶元素
 *     判断栈顶元素是否与当前元素相匹配
 * 注意考虑细节：
 *      1.函数入口首要判断
 *          输入个数为奇数，false
 *      2.非法输入
 *          输入的数字不属于六个括号
 *      3.特殊输入
 *          "" 空
 *          "((" false
 *          "(" false
 */

 /**
 * @param {string} s
 * @return {boolean}
 */
let res = isValid('((');
console.log(res);
function isValid(s) {
    // 如果是奇数肯定不能配对
    if(s.length%2===1){
        return false;
    }
    let leftP = ['{','[','('];
    let rigtP = ['}',']',')'];
    let stack = [];
    let count = 0;// 配对的个数
    for(let i=0;i<s.length;i++){
        if(leftP.includes(s[i])){
            stack.push(s[i])
        }else if(rigtP.includes(s[i])){
            let res = stack.pop();
            let indexR = rigtP.indexOf(s[i]); 
            let indexL = leftP.indexOf(res);             
            // 判断res与s[i]是否相配
            if(indexR===indexL){
                count++;
            }
        }else{
            throw new Error('输入含非法字符！')
        }
    }
    if(count===s.length/2){
        return true;
    }
    return false;
};